package ar.edu.caece.pl.asin.model.impl;

import ar.edu.caece.pl.alex.model.IToken;
import ar.edu.caece.pl.alex.model.impl.Token;
import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.manager.impl.AbstractAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;

public class Var3 extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public Var3 ( ITokenStream ts ) {
		super(ts, false);
	}
	public Var3 ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/**
	 * Devuelve true si reconoce una definicion de tipo o una definicion de multiples variables
	 */
	public boolean reconocer () {
		
		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer Var3:");
		//----------------------------------------------
		
		/* <VAR_3> -> , <VAR>  |
         *            : <TIPO>;  */
		
		if(this.getTokenSiguiente().getType() == IToken.TYPE_COMA){
			
			// <VAR_3> -> , <VAR>

			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<VAR_3> -> , <VAR>", this.getTokenSiguiente() );
			//----------------------------------------------
			
			//Reconocer Coma
			if ( !this.reconocerToken(IToken.TYPE_COMA) ) {
				//El reconocerToken() habria adelantado el tokenStream hasta salir de esta iteracion de Var3,
				//entonces no hay que seguir buscando sino salir
				return false;
			}
			
			// Reconoci "," -> ahora vuelvo al loop principal donde continua <VAR>
			
			// Espio el siguiente para ver si es correcto.
			if ( !Var.primeros(this.getTokenSiguiente()) ) {
				
				this.em.error( "Se esperaba " + this.dic.getTokenDescription(IToken.TYPE_IDENTIFICADOR), this.getTokenSiguiente() );
				this.em.recover(this.getClass(), this.tokenStream);
				return false;
				
			}
			// LISTO: Vuelvo a iterar con el while.
			
		} else if ( this.getTokenSiguiente().getType() == IToken.TYPE_DOS_PUNTOS ) {
			
			// <VAR_3> -> : <TIPO>;
			
			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<VAR_3> -> : <TIPO>;", this.getTokenSiguiente() );
			//----------------------------------------------
			
			//Reconocer Dos Puntos
			if ( !this.reconocerToken(IToken.TYPE_DOS_PUNTOS) ) {
				return false;
			}
			
			IAnalizadorSintactico tipo = new Tipo(this.tokenStream, this.debugMode);
			recognized &= tipo.reconocer();
			
			//Reconocer Punto y Coma
			if ( !this.reconocerToken(IToken.TYPE_PUNTO_COMA) ) {
				return false;
			}
		}
		
		return recognized;
	}
	
	public static boolean primeros(IToken token) {
		return  token.equals( new Token(IToken.TYPE_COMA) ) ||
				token.equals( new Token(IToken.TYPE_DOS_PUNTOS) );
	}
}
